package main

import (
	"fmt"
	"strings"
)

func main() {
	token := "$2a$10$VRwitE5GO4AnIWbQ/OtIQu1JJh4rKiTooK6/GaRqlachZ8jOVLsbi"

	fmt.Printf("=== Token 解析结果 ===\n")
	fmt.Printf("原始token: %s\n", token)
	fmt.Printf("Token长度: %d\n", len(token))

	// 检查token类型
	if strings.HasPrefix(token, "$2a$") || strings.HasPrefix(token, "$2b$") || strings.HasPrefix(token, "$2y$") {
		fmt.Printf("Token类型: bcrypt哈希\n")
		parseBcryptHash(token)
	} else if strings.Contains(token, ".") {
		fmt.Printf("Token类型: JWT token\n")
		parseJWTToken(token)
	} else {
		fmt.Printf("Token类型: 未知\n")
		fmt.Printf("可能是一个简单的字符串或加密后的值\n")
	}
}

// parseBcryptHash 解析bcrypt哈希
func parseBcryptHash(hash string) {
	fmt.Printf("\n--- bcrypt哈希解析 ---\n")

	// 解析bcrypt格式
	parts := strings.Split(hash, "$")
	if len(parts) != 4 {
		fmt.Printf("错误: 无效的bcrypt格式\n")
		return
	}

	fmt.Printf("算法版本: %s\n", parts[1])
	fmt.Printf("成本因子: %s\n", parts[2])
	fmt.Printf("盐值和哈希: %s\n", parts[3])

	// 计算成本因子
	cost := parts[2]
	fmt.Printf("成本因子数值: %s (表示2^%s次迭代)\n", cost, cost)

	// 分析盐值和哈希部分
	saltAndHash := parts[3]
	if len(saltAndHash) >= 53 {
		salt := saltAndHash[:22]
		hashPart := saltAndHash[22:]
		fmt.Printf("盐值: %s\n", salt)
		fmt.Printf("哈希部分: %s\n", hashPart)
		fmt.Printf("盐值长度: %d字符\n", len(salt))
		fmt.Printf("哈希长度: %d字符\n", len(hashPart))
	}

	fmt.Printf("\n注意: bcrypt哈希是单向加密，无法反向解析\n")
	fmt.Printf("只能通过提供原始密码来验证\n")
	fmt.Printf("这个哈希使用了成本因子10，意味着需要2^10=1024次迭代\n")
}

// parseJWTToken 解析JWT token
func parseJWTToken(token string) {
	fmt.Printf("\n--- JWT token解析 ---\n")

	parts := strings.Split(token, ".")
	if len(parts) != 3 {
		fmt.Printf("错误: 无效的JWT格式\n")
		return
	}

	fmt.Printf("Header: %s\n", parts[0])
	fmt.Printf("Payload: %s\n", parts[1])
	fmt.Printf("Signature: %s\n", parts[2])
}
